iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
AI/ ML & Data

基於人工智慧與深度學習對斑馬魚做行為分析系列 第 16

day 16 Lstm結合yolo多斑馬魚相互影響行為分析

  • 分享至 

  • xImage
  •  

今天是第十六天我們可以寫一個lstm結合yolo分析多隻斑馬魚之間的相互行為影響分析,去看看斑馬魚之間會不會影響到之間的情緒,以下是程式碼

  1. YOLO部分:用於偵測並跟蹤每隻斑馬魚的位置和行為。
  2. LSTM部分:用於分析這些位置和行為數據,並預測斑馬魚之間的相互影響。

YOLO部分

首先,我們使用YOLO模型來偵測每一隻斑馬魚的位置。假設我們已經訓練了一個YOLO模型來偵測斑馬魚,這部分的程式碼如下:

import torch
import cv2

# 加載YOLO模型 (假設已經訓練好的模型)
model = torch.hub.load('ultralytics/yolov5', 'custom', path='zebrafish_yolo_model.pt')

def detect_zebrafish(frame):
    # 使用YOLO模型進行偵測
    results = model(frame)
    return results

LSTM部分

在YOLO模型偵測到斑馬魚後,我們需要追蹤每隻斑馬魚的運動軌跡,然後使用LSTM來分析和預測它們之間的行為互動。

首先,我們需要將斑馬魚的運動軌跡(如座標)保存下來,並將它們轉換為適合LSTM處理的格式。

import numpy as np
from collections import deque

# 假設我們需要追蹤每隻斑馬魚的位置
trajectory_data = {}

# 用來存儲每隻斑馬魚的運動軌跡 (x, y座標)
for fish_id in range(number_of_fish):  # 假設已知斑馬魚的數量
    trajectory_data[fish_id] = deque(maxlen=20)  # 只保存最近的20幀

def update_trajectory(fish_id, position):
    trajectory_data[fish_id].append(position)

結合YOLO和LSTM的分析

在收集了一段時間的運動數據後,我們可以使用LSTM來進行行為分析。以下是一個簡單的LSTM模型的例子,用於預測某隻斑馬魚的下一個位置或行為:

import torch
import torch.nn as nn
import torch.optim as optim

class FishBehaviorLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(FishBehaviorLSTM, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)
    
    def forward(self, x):
        h_0 = torch.zeros(num_layers, x.size(0), hidden_size)
        c_0 = torch.zeros(num_layers, x.size(0), hidden_size)
        
        out, _ = self.lstm(x, (h_0, c_0))
        out = self.fc(out[:, -1, :])
        return out

# 模型參數
input_size = 2  # 例如(x, y)座標
hidden_size = 50
num_layers = 2
output_size = 2  # 預測下一個(x, y)座標

model = FishBehaviorLSTM(input_size, hidden_size, num_layers, output_size)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

訓練LSTM模型

在收集到一定數量的斑馬魚運動數據後,我們可以開始訓練LSTM模型。每一筆訓練數據應該包含一段時間內的運動軌跡,以及下一個時間步驟的預測目標。

def train_lstm(trajectory_data, model, criterion, optimizer, epochs=100):
    for epoch in range(epochs):
        for fish_id, trajectory in trajectory_data.items():
            if len(trajectory) < 2:
                continue
            
            inputs = torch.tensor(trajectory[:-1], dtype=torch.float32).unsqueeze(0)
            targets = torch.tensor(trajectory[1:], dtype=torch.float32).unsqueeze(0)
            
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            loss.backward()
            optimizer.step()
        
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

結合與應用

當YOLO偵測到新的斑馬魚位置後,我們可以不斷更新軌跡資料,並通過訓練好的LSTM模型來分析和預測斑馬魚之間的相互影響。

這個系統可以應用於行為分析,例如預測斑馬魚之間的領域行為、群體行為,或者預測一隻斑馬魚對其他斑馬魚行為的反應。這個程式碼只是我初步簡單開始寫而已,真正應用中需要考慮更多的參數,例如資料清理、模型調優和偵測精度還有遺失值等等。


上一篇
day 15 Lstm 結合yolo 多隻斑馬魚使用介面
下一篇
Day 17Lstm預測房價系統
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言